package com.example.designpatterns.flyweight;

import java.util.Random;

// 客户端代码：演示如何使用享元模式
public class FlyweightPatternDemo {
    
    // 可用的颜色
    private static final String[] COLORS = {"红色", "绿色", "蓝色", "黄色", "黑色"};
    
    public static void main(String[] args) {
        System.out.println("===== 享元模式演示 =====");
        
        // 创建并使用20个随机的形状对象
        for (int i = 1; i <= 20; i++) {
            System.out.println("\n--- 绘制第 " + i + " 个形状 ---");
            
            // 随机决定创建圆形还是矩形
            if (getRandomBoolean()) {
                // 创建圆形
                String color = getRandomColor();
                int radius = getRandomSize();
                
                // 通过工厂获取享元对象
                Shape circle = ShapeFactory.getCircle(color, radius);
                
                // 设置外部状态（位置），并绘制
                circle.draw(getRandomCoordinate(), getRandomCoordinate());
            } else {
                // 创建矩形
                String color = getRandomColor();
                int width = getRandomSize();
                int height = getRandomSize();
                
                // 通过工厂获取享元对象
                Shape rectangle = ShapeFactory.getRectangle(color, width, height);
                
                // 设置外部状态（位置），并绘制
                rectangle.draw(getRandomCoordinate(), getRandomCoordinate());
            }
        }
        
        // 显示共享对象数量
        System.out.println("\n===== 结果统计 =====");
        System.out.println("总共创建了 " + ShapeFactory.getShapeCount() + " 个形状对象");
        System.out.println("理论上如果不使用享元模式，需要创建 20 个对象");
        System.out.println("享元模式节省了 " + (20 - ShapeFactory.getShapeCount()) + " 个对象的创建");
    }
    
    // 生成随机颜色
    private static String getRandomColor() {
        return COLORS[new Random().nextInt(COLORS.length)];
    }
    
    // 生成随机大小 (10-50)
    private static int getRandomSize() {
        return 10 + new Random().nextInt(41);
    }
    
    // 生成随机坐标 (0-100)
    private static int getRandomCoordinate() {
        return new Random().nextInt(101);
    }
    
    // 随机生成布尔值
    private static boolean getRandomBoolean() {
        return new Random().nextBoolean();
    }
} 